场景确认:
1.确认服务器和站点程序没有被黑的情况下,网站经常会弹出一些弹窗式的小广告
2.弹窗基本都是页面数据回传到客户端浏览器的过程被电信运营商植入了js外部脚本,该脚本再执行生成iframe广告窗口
大多数情况下运营商HTTP劫持的原理:
在用户的浏览器连上被访问的网站服务器,发送了HTTP请求后,运营商的路由器会首先收到此次HTTP请求,之后运营商路由器的旁路设备标记此TCP连接为HTTP协议,
之后可以抢在网站服务器返回数据之前发送HTTP协议的302代码进行下载软件的劫持,浏览器收到302代码后就会跳转到错误的软件下载地址下载软件了,
随后网站服务器的真正数据到达后反而会被丢弃。或者,旁路设备在标记此TCP连接为HTTP协议后,直接返回修改后的HTML代码,导致浏览器中被插入了运营商的广告,
随后网站服务器的真正数据到达后最终也是被丢弃。
解决办法:
从上述原理中看出,如果需要进行HTTP劫持,首先需要进行标记:如果是HTTP协议,那么进行劫持,否则不进行劫持。那么,是否有一种方法,
既可以避免被旁路设备标记为HTTP协议,而目标网站收到的仍旧是原来的HTTP请求,并且不需要任何第三方服务器呢?答案是有的。
旁路设备中检测HTTP协议的模块通常比较简单,一般只会检测TCP连接建立后的第一个数据包,如果其是一个完整的HTTP协议才会被标记;如果并非是一个完整的HTTP协议,
由于无法得到足够多的劫持信息,所以并不会被标记为HTTP协议(我们伟大的防火墙并非如此,会检查后续数据包,所以这种方法无效)。了解了这种情况后,
防止劫持的方法就比较简单了:将HTTP请求分拆到多个数据包内,进而骗过运营商,防止了HTTP劫持。而目标网站的操作系统的TCP/IP协议栈比较完善,收到的仍旧
是完整的HTTP请求,所以也不会影响网页浏览。
解决方案一:
作为普通用户,一般的建议是打电话给ISP(Internet Service Provider互联网服务提供商)投诉或者投诉工信部,让ISP取消对您的账号的“特殊服务”,非技术手段,
不过一般没什么用。
附上工信部的投诉网址:http://www.chinatcc.gov.cn:8080/cms/shensu/
解决方法一:
那么如何将浏览器发出的HTTP请求拆分到多个数据包中呢?我们可以在本地架设一个代理服务器,在代理服务器将浏览器的HTTP请求进行拆包,浏览器设置本地的
代理服务器即可。我这里经过测试,默认设置的情况下对三大运营商(电信、联通、移动)的HTTP劫持现象都有很好的抑制作用。
这个软件是个开源软件,代码在: https://github.com/lehui99/ahjs5s
解决方案三:
如果是ISP插广告, 全站https就可以
一个可行的办法是HTTPS化,HTTPS请求无法简单的伪造。目前由于网络安全的形势不好,很多网站都做了全站HTTPS化。虽然有一些开销,但毕竟是个最有效的办法
目前ISP的做法是只劫持JS文件,那么另一个简便的方法就是JS全部放到第三方CDN上,利用第三方存储提供的HTTPS服务,把网页上的JS地址换成HTTPS的,ISP就无法伪造了
如果是浏览器开发商,估计无解